#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Datetime: 2020/7/30 10:06
# @Author  : CHEN Wang
# @Site    :
# @File    : conf.py
# @Software: PyCharm

import os
import logging
from configparser import ConfigParser

go_launch = False
# go_launch = True  # 实际上线的时候，选择这个
KEY_INI_PATH = 'THINKIVE_CFY_FACTORS_INI_PATH'


def get_local_config(go_launch):
    """
    根据是否是 代码开发阶段 还是 正式上线阶段，返回找到的对应配置
    :param bool go_launch: 是否正式上线
    :return: config对象（类dict）
    :raise RuntimeError 如果根据配置文件应该在的路却没找到该文件
    """
    config = ConfigParser(allow_no_value=True)
    config_file_path = 'tmm.ini'

    if not go_launch:
        config_file_dir = os.path.abspath(__file__)
        config_file_dir = os.path.dirname(config_file_dir)  # 上一级目录
        config_file_dir = os.path.dirname(config_file_dir)  # 上一级目录
        config_file_dir = os.path.dirname(config_file_dir)  # 上一级目录
        config_file_path = os.path.join(config_file_dir, config_file_path)
    else:
        ini_path = os.getenv(KEY_INI_PATH)
        config_file_path = config_file_path if ini_path is None else ini_path

    tmp_logger = logging.getLogger(__name__)
    tmp_logger.warning(f'---尝试搜寻配置文件 → ⭐[{config_file_path}]⭐---')
    if not os.path.exists(config_file_path):
        raise RuntimeError(f'！！！未找到配置文件 → [{config_file_path}]！！！')
    config.read(config_file_path, encoding='utf8')
    return config


LOCAL_CONF = get_local_config(go_launch=go_launch)


def get(option, **kwargs):
    """
    获取配置的方式可以通过LOCAL_CONF['other']['default_section']
    也可以该函数get('default_section', section='other')
    写这个函数是为了避免在未配置选项时，抛出的任务对于非项目开发者来说看不懂，友好地报错

    :param str option: 选项
    :param kwargs:
        - section，str，配置文件的哪一个section，默认：读取配置：['other']['default_section']
        - fallback，任何值，找不到对应选项时的fallback，默认：报错
    :return:
    """
    section = kwargs.pop('section', None)
    fallback = kwargs.pop('fallback', '$.$')  # 为了区分提供的 None和 未提供
    if section is None:
        try:
            section = LOCAL_CONF['other']['default_section']
        except KeyError as _:
            raise KeyError('未在配置中的 [other] 部分找到选项：default_section')
    if fallback == '$.$':
        try:
            return LOCAL_CONF[section][option]
        except KeyError as _:
            raise KeyError(f'未在配置中的 [{section}] 部分找到选项：{option}')
    else:
        return LOCAL_CONF.get(section=section, option=option, fallback=None)


if __name__ == '__main__':
    LOCAL_CONF = get_local_config(False)
    debug = int(LOCAL_CONF['debugging']['debugging_mode'])
    if debug:
        a = 1